"""
ConnLLM能力基类
定义LLM能力的基本接口和依赖管理
"""
from abc import ABC, abstractmethod
from typing import Any, Dict, List, Optional, Set, Type, ClassVar, TypeVar

# 注册的能力字典
_registered_capabilities: Dict[str, Type["Capability"]] = {}

T = TypeVar('T', bound='Capability')

def register_capability(capability_id: str) -> callable:
	"""
	能力注册装饰器
	
	Args:
		capability_id: 能力标识符
		
	Returns:
		装饰器函数
	"""
	def decorator(cls: Type[T]) -> Type[T]:
		_registered_capabilities[capability_id] = cls
		return cls
	return decorator


class Capability(ABC):
	"""
	LLM能力基类
	
	能力(Capability)代表LLM提供商可能支持的特定功能，
	如流式响应、工具调用、部分模式等
	"""
	
	# 依赖的能力ID，子类可重写
	dependencies: ClassVar[Set[str]] = set()
	
	def __init__(self, provider: Any):
		"""
		初始化能力
		
		Args:
			provider: 所属提供商实例
		"""
		self._provider = provider
		self._initialized = False
		self._initialize()
	
	def _initialize(self) -> None:
		"""
		初始化能力，子类可重写以进行特定初始化
		"""
		self._initialized = True
	
	@property
	def provider(self) -> Any:
		"""获取所属提供商"""
		return self._provider
	
	@classmethod
	def name(cls) -> str:
		"""获取能力名称"""
		return cls.__name__.lower()
		
	@abstractmethod
	def is_supported(self) -> bool:
		"""
		判断当前提供商和模型是否支持此能力
		
		Returns:
			是否支持
		"""
		pass
	
	@classmethod
	def get_dependencies(cls) -> Set[str]:
		"""
		获取此能力依赖的其他能力
		
		Returns:
			依赖的能力ID集合
		"""
		return cls.dependencies
